package kr.co.cherryt.cherryt;

import kr.co.cherryt.common.CC_Log;
import kr.co.cherryt.common.CherrytData;
import kr.co.cherryt.common.Utility;
import kr.co.cherryt.parser.xml.XmlManager;
import kr.co.cherryt.parser.xml.XmlParserCore;
import kr.co.cherryt.parser.xml.XmlManager.XmlResponse;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;

public class UpdateChecker {
	
	Activity m_ownerActivity;
	Intent m_startIntent;
	
	private XmlManager xmlManager = null;
	
    public UpdateChecker(Activity a){
    	m_ownerActivity = a;
    }

    /**
     * 업데이트 체크를 시작한다
     * @param szCheckUrl : 업데이트 정보를 받아 올 수 있는 Web Page (지정된 형식에 맞게 응답값을 보내줘야 한다)
     */
    public void start(String szCheckUrl) {
    	if (xmlManager == null) {
    		xmlManager = new XmlManager();
    	}
    	xmlManager.setNewElementItemList("item_list", "item");
    	xmlManager.fillItemArrayAsync(szCheckUrl, hXmlResultHandler);
    }

    /**
     * 로컬에 설치된 App의 버전을 받아온다
     * @param context
     * @return
     */
	public static int GetLocalAppVersion(Context context){
		int nVersion = 0;
		if(context != null){
			PackageManager pm = context.getPackageManager();
			PackageInfo packageInfo;
			try {
				// UpdateCheck는 versionCode로
				packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
				nVersion = packageInfo.versionCode;
			} catch (NameNotFoundException e) {
				e.printStackTrace();
			}
		}
		return nVersion;
		
	}

    /**
     * 업데이트 체크 결과를 받아올 수 있는 리스너
     */
	CheckResultLisnter m_checkResultListener;

	public void setCheckResultLisnter(CheckResultLisnter l){
    	m_checkResultListener = l;
    }
	
	public interface CheckResultLisnter { 	
		// 업데이트를 위해 마켓으로 랜딩 되었음을 알려준다 
		public void onMarketLanding(int nAppVer, int nServerVer, UpdateChecker obj);

		// 업데이트 체크시 오류 발생
		public void onCheckError(int nErrcode, UpdateChecker obj);
		
		/**
		 * 업데이트 체크 통과
		 * @param nAppVer	 : 현재 설치된 App의 버전
		 * @param nServerVer : 서버에 설정된 App의 버전
		 */
		public void onUpdatePass(int nAppVer, int nServerVer);
	}

	
	/**
	 * 데이터 파싱이 완료되면 호출되는 메소드
	 */
	
	Handler hXmlResultHandler = new Handler() {
		public void handleMessage(Message msg) {
			XmlResponse rep = new XmlResponse(msg);
			if (rep.getXmlManager() == xmlManager) {
			
				String szResultCode = XmlParserCore.getXmlElementData(xmlManager, "resultCode");
				
				CC_Log.info("jin", "### szResultCode:" + szResultCode);
				
				if (szResultCode != null && szResultCode.equals("0")) {
					if(m_ownerActivity == null){
						
						CC_Log.info("jin", "### m_ownerActivity == null");
						
						if(m_checkResultListener != null){
							m_checkResultListener.onCheckError(2020, UpdateChecker.this);
						}
						return;
					}
					
					String szMarketAppVer = XmlParserCore.getXmlElementData(xmlManager, "marketAppVer");
					final String szMarketUrl = XmlParserCore.getXmlElementData(xmlManager, "marketUrl");
					String szUsableAppVer = XmlParserCore.getXmlElementData(xmlManager, "usableAppVer");
					String szUpdateText = XmlParserCore.getXmlElementData(xmlManager, "updateText");
					
					final int nMaketAppVer =  Utility.parseInt(szMarketAppVer);
					final int nUsableMinVer = Utility.parseInt(szUsableAppVer);
					final int nLocalAppVer = GetLocalAppVersion(m_ownerActivity);
					
					CC_Log.info("jin", "### szMarketAppVer : " + szMarketAppVer);
					
					/**
					 * Local의 설치된 버전과 xml에서 받은 버전을 비교
					 */
					if (nLocalAppVer >= nMaketAppVer) {
						if (m_checkResultListener != null) {
							m_checkResultListener.onUpdatePass(nMaketAppVer, nLocalAppVer);
						}				
					} else {
						
						AlertDialog.Builder aDialog = new AlertDialog.Builder(m_ownerActivity);

						aDialog.setPositiveButton("예",
								new DialogInterface.OnClickListener() {
									public void onClick(DialogInterface dialog, int which) {
										// Market으로 페이지 호출
										Intent marketAcitivy = new Intent(
												Intent.ACTION_VIEW, Uri.parse(szMarketUrl));
										m_ownerActivity.startActivity(marketAcitivy);

										if(m_checkResultListener != null){
											m_checkResultListener.onMarketLanding(nLocalAppVer, nMaketAppVer, UpdateChecker.this);
										}
										
										m_ownerActivity.finish();
									}
								});
						
						
						aDialog.setNegativeButton("아니오",
								new DialogInterface.OnClickListener() {
									public void onClick(DialogInterface dialog, int which) {
										
										if(nLocalAppVer < nUsableMinVer) {
											
											Utility.showToast(m_ownerActivity, "업데이트 후 사용 가능합니다.");
											m_ownerActivity.finish();
										} else {
											if(m_checkResultListener != null){
												m_checkResultListener.onUpdatePass(nMaketAppVer, nLocalAppVer);
											}
											
										}
									}
								});
						
						
						aDialog.setTitle("알림");
						aDialog.setMessage(szUpdateText);
						// back 키로 취소 못하도록..
						aDialog.setCancelable(false);
						
						aDialog.show();	
					}
				}
				else {
				// 오류발생 시 처리
					if (m_checkResultListener != null) {
						CC_Log.info("jin", "### 오류1");
						m_checkResultListener.onCheckError(8500, UpdateChecker.this);
					} else {
						CC_Log.info("jin", "### 오류2");
						if (m_ownerActivity != null) {
							Utility.showToast(m_ownerActivity, CherrytData.ERR_NETWORK_MSG);
							m_ownerActivity.finish();
						}
					}
				}
			}
		}
	};
}

